
        <html>
			<head>
			     <title>OS X那些事---恶意软件是如何启动的？ - vvun91e0n</title>
				 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
			</head>
			<body>
				<h1>原文地址:<a href="http://drops.wooyun.org/tips/11370">http://drops.wooyun.org/tips/11370</a></h1>
				
      <p>
        <h1>0x00 背景</h1>

<hr />

<p>前几日，看了一份报告，是美国网络安全公司bit9发布的：<a href="https://www.bit9.com/resources/research-reports/2015-the-most-prolific-year-for-os-x-malware/">《2015: The Most Prolific Year for OS X Malware》</a></p>

<p>报告主要的内容就是说说2015年OS X平台恶意软件的情况。bit9的研究团队进行了10周的分析研究，分析了1400个恶意软件样本。给出了下面这张图，可见，2015年恶意软件样本数量是前5年恶意样本数量之和的5倍。这估计要亮瞎苹果公司的眼。Mac越来越火。也越来越不安全了。</p>

<p><img src="http://static.wooyun.org//drops/20151222/20151222103123646851103.png" alt="p1" /></p>

<!--more-->

<p>报告指出的重点有：</p>

<ol>
<li>现在恶意软件的启动方式（Persistence Mechanisms）使用传统Unix技术的越来越少，基本没有了。大部分恶意软件使用OS X提供的新的启动机制了。</li>
<li>感染持续增长，但是恶意软件的复杂度却不是太高。</li>
<li>主要的启动方式有7种。</li>
<li>由于OS X平台上恶意软件多样性不如windows平台，所有相对的检测方法就简单一些，因为需要需要检查的地方比windows平台的要少。</li>
</ol>

<h1>0x01 启动</h1>

<hr />

<p>接下来就来谈谈这启动的事，看看是哪7种武器是黑客所喜欢的：</p>

<p><img src="http://static.wooyun.org//drops/20151222/2015122210312573144245.png" alt="p2" /></p>

<p>如上7种武器你知道几种（大神就自动飘过）。</p>

<h3>Launch daemons/agents</h3>

<p>其实这两种启动方式可以一起介绍。启动方式基本相同，只是有些区别而已。</p>

<p>这两种方式都是苹果官方提供的标准启动方式。在官方手册里面可以查询到更详细的介绍<a href="https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html#//apple_ref/doc/uid/10000172i-SW7-BCIEDDBJ">[link]</a>。daemons和agents都是由launchd进程负责启动的后台作业。launchd是OS X系统用户态的第一个进程。对应于其他UN*X系统中的init。负责直接或者间接的启动系统中的其他进程。</p>

<p><img src="http://static.wooyun.org//drops/20151222/2015122210312780909335.png" alt="p3" /></p>

<p>从图中可以看到daemons和agents都是由launchd进程启动的。</p>

<ul>
<li>daemons：守护程序，后台服务，通常与用户没有交互。由系统自动启动，不管是否有用户登录系统。</li>
<li>agent：代理程序，是一类特殊的守护程序，只有在用户登录的时候才启动。可以和用户有交互，还可以有GUI。</li>
</ul>

<p>创建一个daemons或agent是非常简单的，就是创建一个普通的二进制可执行文件。然后将自己的属性列表文件（.plist）放置到daemons或agent的配置目录中：</p>

<table>
<thead>
<tr>
  <th align="left">目录</th>
  <th align="left">用途</th>
</tr>
</thead>
<tbody>
<tr>
  <td align="left">/System/Library/LaunchDaemons</td>
  <td align="left">系统本身的守护程序</td>
</tr>
<tr>
  <td align="left">/Library/LaunchDaemons</td>
  <td align="left">第三方程序的守护程序</td>
</tr>
<tr>
  <td align="left">/System/Library/LaunchAgents</td>
  <td align="left">系统本身的代理程序</td>
</tr>
<tr>
  <td align="left">/Library/LaunchAgents</td>
  <td align="left">第三方程序的代理程序，这个目录通常为空</td>
</tr>
<tr>
  <td align="left">~/Library/LaunchAgents</td>
  <td align="left">用户自有的launch代理程序，是有对应的用户才会执行</td>
</tr>
</tbody>
</table>

<p>plist文件的结构可以查看手册<a href="https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html#//apple_ref/doc/uid/TP40001762-104142">[link]</a>,下面给出了一个启动计算器的plist文件。拥有键值为true的RunAtLoad键。</p>

<p><img src="http://static.wooyun.org//drops/20151222/2015122210312990743433.png" alt="p4" /></p>

<p>将此<code>.plist</code>文件拷贝到<code>/Library/LaunchAgents</code>目录（拷贝之后的文件拥有者为root），就可以在重启后，自动启动计算器。</p>

<p>可以使用</p>

<pre><code>#!bash
sudo plutil -lint /path/to/com.test.plist
</code></pre>

<p>来检测plist文件格式是否有问题。</p>

<p>plist中主要的字段和它的含义：</p>

<ul>
<li>Label 用来在launchd中的一个唯一标识，类似于每一个程序都有一个identifies一样。</li>
<li>UserName 指定运行启动项的用户，只有当Launchd 作为 root 用户运行时，此项才适用。</li>
<li>GroupName 指定运行启动项的组，只有当Launchd 作为 root 用户运行时，此项才适用。</li>
<li>KeepAlive 这个key值是用来控制可执行文件是持续运行呢，还是满足具体条件之后再启动。默认值为false，也就是说满足具体条件之后才启动。当设置值为ture时，表明无条件的开启可执行文件，并使之保持在整个系统运行周期内。</li>
<li>RunAtLoad 标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。</li>
<li>Program 这个值用来指定进程的可执行文件的路径。</li>
<li>ProgramArguments 如果未指定Program时就必须指定该项，包括可执行文件文件和运行的参数。</li>
</ul>

<h3>Cron job</h3>

<p>Cron job是一个随Unix而来的启动机制。在OS X中已经不被推荐使用。苹果公司推荐使用launchd命令来完成计划任务。但是OS X仍然支持Cron。那黑客们当然不会嫌弃。</p>

<p>Cron可以用来在设定的时刻执行一个命令或是脚本。如果恶意软件是python编写的，可以直接运行python命令。</p>

<p>Cron服务使用crontab命令来控制。在目录/usr/lib/cron/tabs目录下会有对应的用户名的配置文件。当然可以直接通过命令来进行配置。具体的可以查询手册<a href="https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/crontab.5.html#//apple_ref/doc/man/5/crontab">[link]</a>。</p>

<p>crontab可以直接读取文件作为输入来配置：</p>

<p><img src="http://static.wooyun.org//drops/20151222/2015122210313124686524.png" alt="p5" /> 如图 用crontab加载文本persist</p>

<p>保存文本内容为：</p>

<p><code>*****open /Applications/Calculator.app</code></p>

<p>该配置为每分钟执行open命令打开计算器。</p>

<p><img src="http://static.wooyun.org//drops/20151222/2015122210313331295624.png" alt="p6" /></p>

<p>上图为文件格式，多个任务可以分多行给出，可以用#进行注释。</p>

<p><a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="43abfcdba6cceca7f8e6a7fefca4d7eb033126212c2c37a4eecaaac6cea4feeda5dee6abedfda4feeda6ffc3a5dff9a6d3eca6c9eba0c3c1a7fec5a5dbeca5dfefa7">[email&#160;protected]</a><script data-cfhash='f9e31' type="text/javascript">/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */</script>��在OS X 10.10上测试开机启动计算器没有成功！用时间间隔来启动时可以的。</p>

<p>可以用crontab参数</p>

<ul>
<li>-l    查看当前的crontab配置。</li>
<li>-r    移除所有配置</li>
<li>-e    编辑配置</li>
</ul>

<h3>login items</h3>

<p>login items是苹果公司对需要开机运行的应用程序推荐的启动方式。</p>

<p>有两种使用login item的方式：</p>

<ol>
<li>使用shard file list。</li>
<li>使用Service Management framework。针对sandbox性能的程序[link]。</li>
</ol>

<p>第一种方式：</p>

<p>使用第一种方式启动的login items在系统偏好设置->用户和群组>登录项里面可以查看并设置</p>

<p><img src="http://static.wooyun.org//drops/20151222/2015122210313411204721.png" alt="p7" /></p>

<p>在这个界面可以添加，删除登录项。</p>

<p>这些登录项的信息都保存在<code>~/Library/Preferences/com.apple.loginitems.plist</code>配置文件中，每一个启动项对应一个字典，有Alias，Name等，其中Name是NSString类型，其它是Data类型，进行了base64，所以目前可以删除。（手工添加有文章说可以，在OS X 10.10.x中笔者暂时没有找到方法）。</p>

<p>另外就是通过程序来添加：</p>

<pre><code>#!bash
LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);  //url为app所在的目录 
CFURLRef url = (CFURLRef)[NSURL fileURLWithPath:appPath];
LSSharedFileListItemRef item = LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemLast, NULL, NULL, url, NULL, NULL); 
CFRelease(item);
CFRelease(loginItems);
</code></pre>

<p>有的恶意软件就是利用代码添加login item的方式来实现自启动的。</p>

<p>第二种方式：</p>

<p>使用login item的程序如果是用了沙盒技术就会因为权限问题无法使用第一种方式了。必须使用Service Management Framework。要求有两个程序：一个主程序一个helper程序。helper程序存放在主程序的<code>Contents/Library/LoginItems</code>目录下。主程序在运行时调用<code>SMLoginItemSetEnabled()</code>函数来设置helper程序为自启动程序。具体可以参考<a href="http://martiancraft.com/blog/2015/01/login-items/">[link]</a> <a href="http://www.tanhao.me/pieces/590.html/">[link]</a>。</p>

<p>注意：你的主程序必须在Application的目录下，开机启动的设置才会生效，否则会失败</p>

<h3>StartupItems</h3>

<p>这是苹果公司不推荐的启动方法。但是在现在版本中还没有失效。</p>

<p>一个Startup Item是一个特殊的文件。可以在系统boot进程中得到执行。</p>

<p>创建过程如下：</p>

<p>1，创建目录</p>

<p>StartupItems存放在以下两个路径下：</p>

<ul>
<li><code>/System/Library/StartupItems</code></li>
<li><code>/Library/StartupItems</code>（默认情况下是不存在的，需要自己手动创建）</li>
</ul>

<p>2，生成执行程序或脚本</p>

<p>程序或脚本必须和目录名一样，可执行文件需要获得root权限。</p>

<p>一般使用shell script，因为其创建和更新更为简单。</p>

<p>下图是一个例子：</p>

<p><img src="http://static.wooyun.org//drops/20151222/2015122210313628127820.png" alt="p8" /></p>

<p>开机启动后系统会自动向脚本给出start作为参数。“$1” 表示传给该脚本的第一个参数</p>

<p>StartService(), StopService(), RestartService()</p>

<p>当可执行文件接收到的参数为start，stop或者restart时，执行相对应的函数。</p>

<p>3，创建<code>StartupParameters.plist</code></p>

<p>在目录中创建该文件<code>StartupParameters.plist</code>是一个属性列表。</p>

<p><img src="http://static.wooyun.org//drops/20151222/2015122210313899900918.png" alt="p9" /></p>

<p>关于plist中主要的字段</p>

<p>可以参考：</p>

<p><img src="http://static.wooyun.org//drops/20151222/20151222103139854011017.png" alt="p10" /></p>

<h3>Binary infection</h3>

<p>二进制感染实现驻留。</p>

<p>原理和windows系统下的PE文件感染一样。修改二进制文件获取执行权限执行自己的代码。</p>

<p>因为OS X允许未签名的二进制文件运行。所以该方法依然有效。且感染的方式多种多样。其中最简单的就是修改入口点了。通过修改Mach-O文件的Load Commands。添加新的segment来实现代码的注入感染。</p>

<h1>0x02 检测</h1>

<hr />

<p>针对启动项的检测，bit9的报告针对企业和个人给出了建议。</p>

<p>这里给大家介绍下针对个人Mac的检测方法。</p>

<p>除了手动针对启动项的位置进行检测外，你当然还可以用用脚本。不过推荐一个不错的工具</p>

<p><a href="https://objective-see.com/products/knockknock.html">https://objective-see.com/products/knockknock.html</a></p>

<p>该工具自动扫描9中启动方式。</p>

<p><img src="http://static.wooyun.org//drops/20151222/20151222103141417461121.png" alt="p11" /></p>

<p>读者可以利用此工具来进行一个快速的检测。</p>

<p>该工具的作者还开发了一款启动项动态监控软件</p>

<p><a href="https://objective-see.com/products/blockblock.html">https://objective-see.com/products/blockblock.html</a></p>

<p>可以动态的拦截启动项的添加。大家不妨试试。</p>

<h1>0x03 参考</h1>

<hr />

<ol>
<li>2015: The Most Prolific Year for OS X Malware<br />
<a href="https://www.bit9.com/resources/research-reports/2015-the-most-prolific-year-for-os-x-malware/">https://www.bit9.com/resources/research-reports/2015-the-most-prolific-year-for-os-x-malware/</a></li>
<li>VB2014 paper: Methods of malware persistence on Mac OS X <a href="https://www.virusbtn.com/virusbulletin/archive/2014/10/vb201410-malware-persistence-MacOSX">https://www.virusbtn.com/virusbulletin/archive/2014/10/vb201410-malware-persistence-MacOSX</a></li>
<li>Levin, J. Mac OS X and iOS Internals: To the Apple’s Core. Wrox. 2012</li>
<li>Mac OSX的开机启动配置 <a href="http://www.tanhao.me/talk/1287.html/">http://www.tanhao.me/talk/1287.html/</a></li>
<li>在SandBox沙盒下实现程序的开机启动 <a href="http://www.tanhao.me/pieces/590.html/">http://www.tanhao.me/pieces/590.html/</a></li>
<li>苹果手册<a href="https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html">https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/Introduction.html</a></li>
</ol>      </p>
    
			</body>
		</html>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          